package com.limengrui.controller;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;

import java.util.Optional;

import org.springframework.beans.factory.annotation.Autowired; //提供@Autowired注解
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.DeleteMapping;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping; //@RequestMapping注解，用于指定控制器的根路径。
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

import com.limengrui.Model.Users;
import com.limengrui.service.UsersService;

@RestController
@RequestMapping("/api") // 指定这个控制器的根路径为 /api。所有该控制器下的方法的路径都会以 /api 开头。
public class UsersController {
	// 规则：控制类要有一个服务类
	private final UsersService usersService;

	@Autowired // 构造一个新的控制类对象(王五)时,自动构建一个服务员对象(张三),同时自动创建一个司机对象(李四)
	public UsersController(UsersService usersService) {
		this.usersService = usersService;
	}
	
	//当前只有一个路由：localhost：8090/api/users参数，对应一个方法registerUser对象,含义就是只有一个功能
	@GetMapping("/users")
	/*
	 * 这次不直接返回Users对象给浏览器，而是返回一个ResponseEntity响应对象，实现更全面的响应控制，毕竟不是每次都是能成功返回数据，
	 * 尖括号的问号表示响应体类型，可以是任何一个类型 例如： ResponseEntity<Users>表示响应体是一个Users对象，
	 * ResponseEntity<String>表示响应体是一个字符串
	 */
	public ResponseEntity<?> registerUser(

				@RequestParam("username") String username, // 如果用户请求参数和方法入参名称一样，可以不写
				@RequestParam("email") String email,
				@RequestParam("password") String password,
				@RequestParam(value = "bio", required = false) String bio,
				@RequestParam(value = "image", required = false) String image
			) {
		try {
			Users newUser = new Users(username, email, password);
			newUser.setBio(bio);
			newUser.setImage(image);
			Users createdUser = usersService.createUser(newUser);
			return ResponseEntity.ok(createdUser); // 调用ResponseEntiy的静态方法ok(),返回JSON格式的createdUser 对象给浏览器
		} catch (Exception e) {
			// 返回错误响应或处理异常
			return ResponseEntity.status(500).body(e.getMessage());
		}
	}
	
	
	/*
	 * 根据用户编号获取用户信息
	 * @param id 用户编号
	 * @return 包含用户信息的ResponseEntity,或错误信息
	 */
	@GetMapping("/users/{id}") //localhost:8090/api/users/3
	public ResponseEntity<?> getUserByID(@PathVariable Long id){ //ResponseEntity类是一个支持泛型的容器类
	try {
		// 调用服务层方法，根据用户编号获取用户信息
		Optional<Users> user = usersService.getUserByID(id);
		if (user.isPresent()) {
			//如果用户存在，返回200成功代码和用户对象
			return ResponseEntity.ok(user.get()); 
		}else {
			//如果用户不存在，返回404代码和错误消息
			return ResponseEntity.status(HttpStatus.NOT_FOUND).body("User not found"); 
		}
	} catch (Exception e) {
		//捕获并处理其他异常，返回500 Internal Server Error 和错误消息
		return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body(e.getMessage()); 
	}
}
	
	/*
	 * 根据用户编号删除用户
	 * @param id 用户编号
	 * @return 删除成功的的ResponseEntity,或错误信息
	 */
	@DeleteMapping("/users/{id}") //当用户输入网址为/api/users/某个编号，而且请求类型不是get或post，而是delete时，本方法会被调用
	public ResponseEntity<?> deleteUserByID(@PathVariable Long id){ //ResponseEntity类是一个支持泛型的容器类
	try {
		// 调用服务层方法，根据用户编号删除用户
		boolean isDeleted = usersService.deleteUserByID(id);
		if (isDeleted) {
			//如果用户存在，返回200成功代码和用户对象
			return ResponseEntity.ok("该用户被成功删除!"); 
		}else {
			//如果用户不存在，返回404 Not Found 和错误消息
			return ResponseEntity.status(HttpStatus.NOT_FOUND).body("找不到该用户!"); 
		}
	} catch (Exception e) {
		//捕获并处理其他异常，返回500 Internal Server Error 和错误消息
		return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body(e.getMessage()); 
	}
  }


    @PostMapping("/users") // 标记该方法处理 POST 请求，路径为 /api/users
    public ResponseEntity<?> registerUser(@RequestBody Users newUser) {
        try {
            Users createdUser = usersService.createUser(newUser); // 调用用户服务类的 createUser 方法创建新用户
            return ResponseEntity.ok(createdUser); // 如果创建成功，返回 HTTP 200 OK 和创建的用户对象
        } catch (Exception e) {
            // 如果创建过程中发生异常，返回 HTTP 500 内部服务器错误，并附带异常信息
            return ResponseEntity.status(500).body(e.getMessage());
        }
    }
}

